/**
 所有viewmodel的基类，所有需要通过baseview.extend({})去扩展
 默认new一个新的派生类会先后调用this.initialize和this.render.一般会把knockout中的模板实现放到render方法之中
 参考了backbone里view的最基本实现，在这里借鉴，来实现组件最基本的生命周期,TODO://后续应该参考React里的生命周期，来实现
 以保证以后能更好的过渡到react
 基本的生命周期
 new viewmodel() --> initialize --> render

 另外所有组件对外暴露的接口需要定义在export里面

 @author songhlc
 @date 2015-12-17
 */
define(["jquery","core","lodash","knockout","static/js/core/customvalidate","uui","biz"],function($,core,_,ko,customvalidate){
    var viewOptions = ['model', 'collection', 'el', 'id', 'attributes', 'className', 'tagName', 'events'];
    /*view基类，定义生命周期 initialize -> setTemplate -> render -> bindEvents*/
    var baseview = function(options){
        _.extend(this, options);
        this.initialize.apply(this, arguments);
        this.setTemplate.apply(this,arguments);
        this.app = $.createApp();
        if(this.viewmodel&&this.viewmodel.el){
            //将events合并到viewmodel
            if(this.events){
                $.extend(this.viewmodel,this.events);
            }
            this.viewmodel._app = this.app
            this.app.init(this.viewmodel, $(this.viewmodel.el)[0]);
        }
        this.initHistoryParams.apply(this, arguments);
        this.render.apply(this,arguments);
        this.fireEvents.apply(this,arguments);
        this.bindEvents.apply(this,arguments);
    }
    _.extend(baseview.prototype, {}, {
        initialize: function(option){},//初始化函数,一般用来解析参数
        setTemplate:function(){},//设置模板
        render: function() {//渲染模板函数
            return this;
        },
        initHistoryParams: function () {}, //用于初始化加载页面历史查询参数(列表页=>详细页=>列表页)
        fireEvents:function(){},//通常用于firedatatable的事件
        bindEvents:function(){},//绑定自定义事件或者自定义监听
        exports:{},//定义所有对外的接口
        events:{},
        viewmodel:{},
        customvalidate: customvalidate,
        kobinded:function(viewmodel,element){
            ko.applyBindings(viewmodel,element);
            this.iskobinded = true;
        },
        iskobinded:false,
        el:$("<div></div>")//组件对应的页面元素父节点
    });
    baseview.extend = core.extend;
    return baseview;
});